package com.houweishi.module.clockingcount.service.impl;

import com.houweishi.common.core.domain.entity.SysDept;
import com.houweishi.common.core.domain.entity.SysUser;
import com.houweishi.common.utils.DateUtils;
import com.houweishi.common.utils.SecurityUtils;
import com.houweishi.module.clocking.mapper.BizClockingMapper;
import com.houweishi.module.clockingcount.domain.BizClockingCount;
import com.houweishi.module.clockingcount.mapper.BizClockingCountMapper;
import com.houweishi.module.clockingcount.service.IBizClockingCountService;
import com.houweishi.module.staff.domain.BizStaff;
import com.houweishi.module.staff.mapper.BizStaffMapper;
import com.houweishi.system.mapper.SysDeptMapper;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 员工打卡统计Service业务层处理
 *
 * @author houweishi
 * @date 2023-03-04
 */
@Service
public class BizClockingCountServiceImpl implements IBizClockingCountService {

    @Resource
    private BizClockingCountMapper bizClockingCountMapper;

    @Resource
    private BizClockingMapper bizClockingMapper;

    @Resource
    private SysDeptMapper sysDeptMapper;

    @Resource
    private BizStaffMapper bizStaffMapper;

    /**
     * 查询员工打卡统计
     *
     * @param id 员工打卡统计主键
     * @return 员工打卡统计
     */
    @Override
    public BizClockingCount selectBizClockingCountById(Long id) {
        return bizClockingCountMapper.selectBizClockingCountById(id);
    }

    /**
     * 查询员工打卡统计列表
     *
     * @param bizClockingCount 员工打卡统计
     * @return 员工打卡统计
     */
    @Override
    public List<BizClockingCount> selectBizClockingCountList(BizClockingCount bizClockingCount) {
        return bizClockingCountMapper.selectBizClockingCountList(bizClockingCount);
    }

    /**
     * 新增员工打卡统计
     *
     * @param bizClockingCount 员工打卡统计
     * @return 结果
     */
    @Override
    public int insertBizClockingCount(BizClockingCount bizClockingCount) {
        bizClockingCount.setCreateTime(DateUtils.getNowDate());
        return bizClockingCountMapper.insertBizClockingCount(bizClockingCount);
    }

    /**
     * 修改员工打卡统计
     *
     * @param bizClockingCount 员工打卡统计
     * @return 结果
     */
    @Override
    public int updateBizClockingCount(BizClockingCount bizClockingCount) {
        bizClockingCount.setUpdateTime(DateUtils.getNowDate());
        return bizClockingCountMapper.updateBizClockingCount(bizClockingCount);
    }

    /**
     * 批量删除员工打卡统计
     *
     * @param ids 需要删除的员工打卡统计主键
     * @return 结果
     */
    @Override
    public int deleteBizClockingCountByIds(Long[] ids) {
        return bizClockingCountMapper.deleteBizClockingCountByIds(ids);
    }

    /**
     * 删除员工打卡统计信息
     *
     * @param id 员工打卡统计主键
     * @return 结果
     */
    @Override
    public int deleteBizClockingCountById(Long id) {
        return bizClockingCountMapper.deleteBizClockingCountById(id);
    }

    /**
     * 查询员工当月打卡统计列表
     *
     * @param bizClockingCount 员工打卡统计
     * @return 员工打卡统计
     */
    @Override
    public List<BizClockingCount> selectBizClockingCountListByMonth(BizClockingCount bizClockingCount) {
        return bizClockingCountMapper.selectBizClockingCountListByMonth(bizClockingCount);
    }


    /**
     * 查询每个员工本月打卡记录
     *
     * @return 打卡集合
     */
    public List<Map<String, Object>> selectTreeList(BizClockingCount bizClockingCount) {

        List<BizClockingCount> list1 = bizClockingCountMapper.selectStaffNameList(bizClockingCount);
        List<BizClockingCount> list2 = bizClockingCountMapper.selectBizClockingCountListByMonth2(bizClockingCount);

        List<Map<String, Object>> nameList = new ArrayList<Map<String, Object>>();

        //比对员工id，等到本月打卡集合
        for (BizClockingCount name : list1) {
            Map<String, Object> map = new HashMap<>();
            ArrayList countList = new ArrayList();

            for (BizClockingCount clockingCount : list2) {

                if (name.getStaffId().equals(clockingCount.getStaffId())) {
                    countList.add(clockingCount);
                }
            }
            map.put("staffId", name.getStaffId());
            map.put("staffName", name.getStaffName());
            map.put("list", countList);
            nameList.add(map);
        }

        return nameList;
    }

    /**
     * 查询本部门每个员工本月打卡记录（本部门及下属部门员工信息）
     *
     * @return 打卡集合
     */
    public List<Map<String, Object>> selectTreeList2(BizClockingCount bizClockingCount) {

        //拿到登录者的deptId
        SysUser sysUser = SecurityUtils.getLoginUser().getUser();
        Long deptId = sysUser.getDeptId();

        //获取匹配到的员工信息（本部门及下属部门员工信息）
        List<BizStaff> bizStaffList2 = new ArrayList<>();
        BizStaff bizStaff = new BizStaff();
        List<BizStaff> bizStaffList = bizStaffMapper.selectBizStaffList(bizStaff);
        if (!CollectionUtils.isEmpty(bizStaffList)) {
            bizStaffList.forEach(staff -> {
                SysDept dept = sysDeptMapper.selectDeptById(staff.getDept());
                //等于部门id或者祖级id
                if (dept.getAncestors().contains(deptId.toString()) || deptId.equals(dept.getDeptId())) {
                    bizStaffList2.add(staff);
                }
            });
        }

        //本月所有员工卡数据
        BizClockingCount bizClockingCount1 = new BizClockingCount();
        bizClockingCount1.setClockDate(bizClockingCount.getClockDate());
        List<BizClockingCount> list = bizClockingCountMapper.selectBizClockingCountListByMonth2(bizClockingCount1);
        List<Map<String, Object>> nameList = new ArrayList<Map<String, Object>>();
        //本部门及下属部门的本月打卡记录
        if (!CollectionUtils.isEmpty(bizStaffList2) && !CollectionUtils.isEmpty(list)) {
            for (BizStaff staff : bizStaffList2) {
                Map<String, Object> map = new HashMap<>();
                List<BizClockingCount> countList = new ArrayList<>();
                for (BizClockingCount clockingCount : list) {
                    if (clockingCount.getStaffId().equals(staff.getId())) {
                        countList.add(clockingCount);
                    }
                }
                map.put("staffId", staff.getId());
                map.put("staffName", staff.getName());
                map.put("deptName", staff.getDeptName());
                map.put("list", countList);
                nameList.add(map);
            }
        }
        return nameList;
    }

}
